package cn.demoncat.util.mobile;

import java.io.FileInputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import cn.demoncat.util.exception.IoRuntimeException;
import cn.demoncat.util.io.IoUtil;
import cn.demoncat.util.lang.ObjectUtil;
import cn.demoncat.util.lang.ParamValidUtil;
import cn.demoncat.util.mobile.config.MobileRegionProperties;
import cn.demoncat.util.web.entity.MobileRegion;

/**
 * 手机号-地址映射
 * 
 * @author 延晓磊
 *
 * @since 2020年5月9日
 */
@Component
public class MobileRegionUtil {

	@Resource
	private MobileRegionProperties mobileRegionProperties;
	
	// 映射缓存
	private static final Map<String, MobileRegion> CACHE = new HashMap<>();
	// 初始化状态
	private static boolean isInited = false;
	
	/**
	 * 查询Mobile地区映射
	 * 
	 * @param mobile	手机号，电话号（区号用-分隔）
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年5月9日
	 */
	public MobileRegion search(String mobile) {
		// 标识
		String key = null;
		if (StringUtils.isNotBlank(mobile)) {
			if (ParamValidUtil.isMobile(mobile)) {
				// 手机号：0-7
				key = mobile.substring(0, 7);
			}else if (ParamValidUtil.isTel(mobile)) {
				// 电话：1-2，1-3
				key = StringUtils.split(mobile, '-')[0].substring(1);
			} 
		}
		// 查询
		if (key == null) {
			return MobileRegion.UNKNOWN;
		}else {
			// 初始化
			if (!isInited) {
				synchronized (MobileRegionUtil.class) {
					init();
				}
			}
			return ObjectUtil.toDefault(CACHE.get(key), MobileRegion.UNKNOWN);
		}
	}

	/**
	 * 初始化缓存
	 * 
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年5月9日
	 */
	private void init(){
		// 读取数据
		List<String> list;
		try {
			list = IoUtil.readToStrs(Files.newInputStream(Paths.get(mobileRegionProperties.getDb())));
		} catch (Exception e) {
			throw new IoRuntimeException("初始化mobile.data失败", e);
		}
		// 加载缓存
		String[] arr;
		MobileRegion region;
		for (String line : list) {
			// 切割行：手机号，电话区号，省，[市，]运营商
			arr = StringUtils.split(line);
			if (arr != null && arr.length > 1) {
				if (arr.length == 4) {
					// 直辖市
					region = MobileRegion.buildInland(arr[2], null, arr[3]);
				}else {
					// 普通省市
					region = MobileRegion.buildInland(arr[2], arr[3], arr[4]);
				}
				// 手机号：0-7
				CACHE.put(arr[0], region);
				// 电话号：1-2，1-3
				CACHE.put(arr[1], region);
			}
		}
		isInited = true;
    }
	
}
